package cn.tedu.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/*本类用于测试自定义注解，熟悉注解相关规则*/
public class TestAnnotation {

}
/*1.首先注意：自定义注解的语法与java不同，不要套用java的格式*/
//定义自定义注解

/*1.1通过@Target注解来描述当前自定义注解可以使用的位置
*        注意@Targrt注解使用的时候需要导包，他的值ElementType.常量来指定
*         如果他需要指定多个值，可以使用{ ，}的格式来写*/
/*1.2 我们通过@Retention注解表明自定义注解的生命周期
 *          注意@Retention使用时需要导包,他的值通过"RetentionPolicy.静态常量"来指定
 *          也就是自定义注解可以存活多久：源文件/字节码文件中/运行时
 *          而且，这三个值只能选一个不能多写*/
/*3. 自定义注解添加功能--给自定义注解添加属性*/
/*注意 int age()不是定义的方法，而是在自定义注解中定义age属性的语法
* 如果为了使用方便，还可以给属性指定默认值，这样注解就可以不赋值直接使用
* int age() default 0;*/
@Retention(RetentionPolicy.SOURCE)
@Target({ElementType.METHOD,ElementType.FIELD,ElementType.TYPE})

        /*注解定义要使用@interface 注解名字的方式来定义*/
    @interface Test{
   // int age() ;
int age() default 0;//设置默认值
    /*4.给注解定义一个特殊属性value
    * 特殊属性的定义与其他普通属性的定义相同，主要是使用方式不同
    * 使用此注解时，属性赋值不再需要写属性名，直接写值就可以@Test(value = "apple")可以简写成 @Test("apple")
    * 但是自定义注解中，赋予默认值的格式不可以简写，如果给特殊属性赋予了默认值，使用时可以不赋值，使用默认值即可*/

    String value() default "lemon";
}
/*使用注解时，只要在自定义注解前加@既可以使用次注解*/
//2.定义一个类测试自定义注解
//@Test
class TestAnno{
    /*测试一：分别给TestAnno属性方法都添加了@Test注解，都不报错
    *                   自定义注解可以加在可以加在什么位置，取决于@Target的值
    * 测试二 修改@Tegect的值@Target({ElementType.METHOD,ElementType.FIELD})
    *                   结论 注解@Target可以存在多个位置，如果有多个值，格式为{ , }
    * 原因：Target注解的源码：ElementType[] value()*/
   // @Test
    private String name;
    /*测试三 当我们添加了 age属性只后，@Test注解报错
    *               结论 当我们没有给自定义注解定义时，可以直接使用但是如果有属性的话，属性必须赋值
    * 测试四：给@Test注解添加属性后不报错了
    *           结论 给属性赋值格式 @Test(age=1001), 不可以直接写值，这是错误格式*/
    /*测试五 给age属性赋值之后，可以不加属性直接使用注解
    *           此时age使用的属性值是age的默认值*/
    /*测试六 给特殊属性赋值时可以简写，相当于 value="apple"
    * 测试七  因为两个属性均被设置默认值，所以无需测试，可以直接使用@Test*/
   // @Test(age=1001)
    //@Test(value = "apple")
    @Test("apple")
    public void eat(){
        System.out.println("吃屎把你！");
    }
}